package com.sunny.interceptor;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.sunny.common.AuthCode;
import com.sunny.common.AuthValidate;
import com.sunny.exceptions.BusinessException;
import com.sunny.utils.JsonUtil;

/**
 *
 * 项目名称：---
 * 模块名称：接入层
 * 功能描述：用户登录拦截器（利用SpringMVC自定义拦截器实现）
 * 创建人： yubao.jin
 * 创建时间：2018年6月6日 下午15:16:12
 * 修改人： yubao.jin
 * 修改时间：2018年6月6日 下午15:16:12
 */
public class UserLoginInterceptor implements HandlerInterceptor {

    /**
     *
     * 描述：构造函数
     * @author yubao.jin
     * @created 2018年6月6日 下午15:16:12
     * @since
     * @param: accessService
     */
    public UserLoginInterceptor() {

    }

    /**
     *
     * 描述：执行方法前
     * @author yubao.jin
     * @created 2018年6月6日 下午15:16:12
     * @since
     * @param request HttpServletRequest
     * @param response HttpServletResponse
     * @param handler handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
            //校验登录
            this.userLoginValidate(request);
            //校验权限
            this.userAuthValidate(request, handler);
        } catch (Exception e) {
            e.printStackTrace();
            printMessage(response, e);
            return false;
        }
        return true;
    }

    /**
     *
     * 描述：输出到前端
     * @author yubao.jin
     * @created 2018年6月6日 下午15:16:12
     * @since
     * @param response 响应
     * @param res 对象
     * @throws Exception
     */
    public static void printMessage(HttpServletResponse response, Object res) throws Exception{
        PrintWriter writer = null;
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=utf-8");
        try {
            writer = response.getWriter();
            writer.print(JsonUtil.toJson(res));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null){
                writer.close();
            }
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request,    HttpServletResponse response, Object handler, Exception ex)    throws Exception {

    }

    /**
     *
     * 描述：用户登录校验
     * @author yubao.jin
     * @created 2018年6月6日 下午15:16:12
     * @since
     * @param request
     * @throws BusinessException
     */
    private void userLoginValidate(HttpServletRequest request) throws BusinessException {
        //校验代码
    }

    /**
     *
     * 描述：用户权限校验
     * @author yubao.jin
     * @created 2018年6月6日 下午15:16:12
     * @since
     * @param request HttpServletRequest
     * @param handler
     * @return
     * @throws BusinessException
     */
    private void userAuthValidate(HttpServletRequest request, Object handler) throws BusinessException {
        AuthValidate validate = ((HandlerMethod) handler).getMethodAnnotation(AuthValidate.class);
        if(validate == null){
            throw new BusinessException("未配置自定义注解");
        }
        String funcCode = validate.value().getAuthCode();
        if(funcCode.equals(AuthCode.Allow.getAuthCode())){
            return;
        }
        String authId = validate.value().getAuthId();
        List<String> auths = new ArrayList<>();//模拟从缓存或者从数据库中查询出对应用户的权限
        if(!auths.contains(authId)){
            throw new BusinessException("权限不足");
        }
    }

}